package com.weng.cloud.service8881.jdk8;


import lombok.SneakyThrows;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * <a href="https://blog.csdn.net/nmyangym/article/details/7850882">wait() 一定需要notify()唤醒吗？</a>
 */
public class ThreadTest {

    public static void main(String[] args) throws InterruptedException {
        ThreadB b = new ThreadB();
        Threadc c = new Threadc();
        c.setName("c线程");
        b.setName("b线程");
        c.start();

        // 1.1 c线程 在到达main的synchronized{}时，run执行完毕(c的生命周期无了都)，那么下面的代码就变成了将main线程挂起
        // 这里需要注意：这个故事告诉我们不要用线程对象作为锁对象 -> 这里的main可能会一直挂起
        // 那有人就会问了，把 c.start(); 放在main.synchronized{}里面不就完事了吗 -> 反过来想，那你为什么要使用多线程 -> 这不就变成单线程了吗
//        Thread.sleep(1000);
//        System.out.println(Thread.currentThread().getName() + "is start....");

        // 1.2 c线程 在到达main的synchronized{}时，未执行完
        // wait 挂起main线程，继续走完c线程，会继续执行main


        //
        synchronized (c) {
            try {
                System.out.println("waiting for b1 to complete....");
                c.wait();
                System.out.println("Completed.now back to" +
                        Thread.currentThread().getName());
                b.start();
            } catch (InterruptedException e) {
            }
        }
    }
}

class ThreadB extends Thread {
    int total;

    public void run() {
        synchronized (this) {
            System.out.println(Thread.currentThread().getName() + "is running..");
            for (int i = 0; i < 10; i++) {
                total += i;
            }

/*            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/

            System.out.println("total is" + total);
        }
    }
}

class Threadc extends Thread {
    int sum = 1;

    public void run() {
        synchronized (this) {
            System.err.println(Thread.currentThread().getName() + "is running..");
            for (int i = 1; i < 10; i++) {
                sum *= i;
            }
/*        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        System.err.println("sum is" + sum);
            notify();
        }
    }
}